package com.jacklin.shopping.mall.service.Impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Maps;
import com.lbz.common.ServerResponse;
import com.lbz.dao.ShippingMapper;
import com.lbz.entity.Shipping;
import com.lbz.service.ShippingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @Author 林必昭
 * @Date 2019/6/20 22:54
 */

@Service
public class ShippingServiceImpl implements ShippingService {

    @Autowired
    private ShippingMapper shippingMapper;


    /**
     * 添加地址的与前端的约定是：成功之后要返回前端shippingId，那么就需要
     * 使用useGeneratedKeys="true" keyProperty="id"插入成功之后返回主键
     *
     *
     * @param userId
     * @param shipping
     * @return
     */
    @Override
    public ServerResponse add(Integer userId, Shipping shipping) {
        //因为没有让前端传userId，后台直接赋值一下
        shipping.setUserId(userId);
        int rowCount = shippingMapper.insert(shipping);
        //存储单返回给前端的shippingId
        Map result = Maps.newHashMap();
        result.put("shippingId", shipping.getId());
        if (rowCount > 0) {
            return ServerResponse.createBySuccess("新增地址成功", result); //返回shippingId
        }
        return ServerResponse.createByErrorMessage("新增地址失败");
    }

    /**
     * 注意这里的删除处理传一个shippingId，为什么还要传一个userId呢?
     * <p>
     * 试想，当用户在登陆状态的时候，如果只需要传一个shippingId就能实现删除
     * ，那当传的不是个人的shippingId就会产生越权问题--所谓的横向越权。
     *
     * @param userId
     * @param shippingId
     * @return
     */
    @Override
    public ServerResponse<String> delete(Integer userId, Integer shippingId) {
        //为了防止横向越权这个方法不可以使用，不需要定义deleteByUserIdShippingId()方法来实现删除
//        int rowCount = shippingMapper.deleteByPrimaryKey(shippingId);
        int rowCount = shippingMapper.deleteByUserIdShippingId(userId, shippingId);
        if (rowCount > 0) {
            return ServerResponse.createBySuccessMessage("删除地址成功");
        }
        return ServerResponse.createByErrorMessage("删除地址失败");
    }

    @Override
    public ServerResponse update(Integer userId, Shipping shipping) {
        //重新赋值userId
        shipping.setUserId(userId);
        /**
         * 使用登陆的shipping重新赋值给userId，为什么还需要重新赋值一下???因为shipping的userId也是可以模拟的，
         * 如果不从登陆用户里面拿，直接用传来的userId，这样也会把被人的地址更新掉，那么还是存在越权问题的，所有要重新赋值一下。
         */
        int rowCount = shippingMapper.updateByShipping(shipping);
        if (rowCount > 0) {
            return ServerResponse.createBySuccessMessage("更新地址信息成功");
        }
        return ServerResponse.createByErrorMessage("更新地址信息失败");
    }

    /**
     * 注意查询的返回值类型是Shipping
     *
     * @param userId
     * @param shippingId
     * @return
     */
    @Override
    public ServerResponse<Shipping> select(Integer userId, Integer shippingId) {
        Shipping shipping = shippingMapper.selectByShippingIdUserId(userId, shippingId);
        if (shipping == null) {
            return ServerResponse.createByErrorMessage("无法查询到该地址");
        }
        return ServerResponse.createBySuccess("查询地址成功", shipping);
    }

    /**
     * 地址列表，分页
     *
     * @param userId
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public ServerResponse<PageInfo> list(Integer userId, int pageNum, int pageSize) {
        /**
         * pageHelper的使用，在需要进行分页的Mybatis的查询方法之前调用PageHelper静态方法即可，
         * 紧跟在这个方法后的第一个MyBatis查询方法会被进行分页
         */
        PageHelper.startPage(pageNum, pageSize);
        //根据用户id查询所有的地址
        List<Shipping> shippingList = shippingMapper.selectByUserId(userId);
        PageInfo pageInfo = new PageInfo(shippingList);
        return ServerResponse.createBySuccess(pageInfo);
    }
}
